import re
from typing import List, Dict, Optional


def structure_labor_law_metadata(processed_data: List[Dict]) -> List[Dict]:
    """
    对预处理后的法条数据进行深度元数据提取，生成支持法律检索的结构化字段

    参数:
        processed_data: 预处理后的法条列表（包含vector_text、metadata、id）

    返回:
        增强元数据后的完整数据，新增法律要素、适用场景、责任类型等检索维度
    """
    structured_results = []

    for item in processed_data:
        base_meta = item['metadata']
        content = base_meta['content_clean']
        article_num = base_meta['article_num']

        # 1. 提取核心法律要素（权利/义务主体、行为规范）
        legal_elements = _extract_legal_elements(content, article_num)

        # 2. 标注适用场景（如试用期、解除合同等）
        applicable_scenarios = _identify_applicable_scenarios(content, article_num)

        # 3. 解析责任类型（如赔偿、处罚等，仅法律责任章节）
        liability_types = _parse_liability_types(content, base_meta['chapter'])

        # 4. 提取条款项编号（如"(一)""(1)"）
        clauses = _extract_clauses(content)

        # 5. 生成检索标签（合并多维度关键词）
        search_tags = _generate_search_tags(
            base_meta['article_title'],
            applicable_scenarios,
            legal_elements['subjects']
        )

        # 整合增强元数据
        enhanced_meta = {
            **base_meta,  # 保留原有基础元数据
            # 新增法律专业维度
            "legal_elements": legal_elements,
            "applicable_scenarios": applicable_scenarios,
            "liability_types": liability_types,
            "clauses": clauses,
            "search_tags": search_tags,
            # 检索权重（重要法条可提升权重）
            "retrieval_weight": _calculate_retrieval_weight(article_num)
        }

        structured_results.append({
            "id": item['id'],
            "vector_text": item['vector_text'],
            "metadata": enhanced_meta
        })

    return structured_results


def _extract_legal_elements(content: str, article_num: str) -> Dict:
    """提取法律要素：权利义务主体、行为模式、法律后果"""
    # 主体识别（用人单位/劳动者/双方）
    subject_patterns = {
        "employer": r'用人单位|企业|单位|雇主',
        "employee": r'劳动者|职工|员工',
        "both": r'双方|当事人'
    }
    subjects = []
    for role, pattern in subject_patterns.items():
        if re.search(pattern, content):
            subjects.append(role)

    # 行为模式（禁止性/义务性/授权性）
    action_type = "neutral"  # 中性条款
    if re.search(r'不得|禁止|严禁', content):
        action_type = "prohibitive"  # 禁止性条款
    elif re.search(r'应当|必须|有义务', content):
        action_type = "obligatory"  # 义务性条款
    elif re.search(r'可以|有权|允许', content):
        action_type = "permissive"  # 授权性条款

    # 法律后果（如赔偿、处罚等）
    consequence = None
    consequence_match = re.findall(
        r'(赔偿\d+%?工资|支付\d+倍工资|罚款\d+元|责令\w+|承担\w+责任)',
        content
    )
    if consequence_match:
        consequence = consequence_match[0]
    elif re.search(r'(赔偿|支付|罚款|责令|承担责任)', content):
        consequence = "承担相应法律责任"

    return {
        "subjects": subjects,
        "action_type": action_type,
        "consequence": consequence
    }


def _identify_applicable_scenarios(content: str, article_num: str) -> List[str]:
    """识别法条适用场景（基于法律场景词库）"""
    scenario_keywords = {
        "contract_signing": r'订立|签订|书面合同|试用期|条款',
        "contract_termination": r'解除|终止|辞退|裁员|辞职',
        "remuneration": r'工资|报酬|加班费|奖金|福利',
        "working_conditions": r'工作时间|休息|休假|安全|健康',
        "compensation": r'经济补偿|赔偿金|违约金|补偿标准',
        "dispute_resolution": r'仲裁|诉讼|协商|调解',
        "special_groups": r'女职工|未成年工|残疾人|职业病'
    }

    scenarios = []
    # 优先基于法条号匹配已知场景
    article_scenario_map = {
        '第十条': ['contract_signing'],
        '第十四条': ['contract_signing'],
        '第十九条': ['contract_signing'],
        '第三十八条': ['contract_termination'],
        '第三十九条': ['contract_termination'],
        '第八十二条': ['remuneration', 'compensation'],
        '第四十六条': ['contract_termination', 'compensation'],  # 经济补偿适用情形
        '第四十七条': ['contract_termination', 'compensation'],  # 经济补偿计算标准
        '第四十八条': ['contract_termination', 'compensation']  # 违法解除的赔偿金
    }
    if article_num in article_scenario_map:
        scenarios.extend(article_scenario_map[article_num])

    # 再基于内容匹配场景
    for scenario, pattern in scenario_keywords.items():
        if scenario not in scenarios and re.search(pattern, content):
            scenarios.append(scenario)

    return scenarios


def _parse_liability_types(content: str, chapter: str) -> List[str]:
    """解析责任类型（仅法律责任章节有效）"""
    if '法律责任' not in chapter:
        return []

    liability_patterns = {
        "economic_compensation": r'经济补偿|补偿金',
        "damages": r'赔偿金|赔偿损失',
        "administrative_fine": r'罚款|责令改正|行政处罚',
        "criminal_liability": r'刑事责任|构成犯罪|依法追究刑事责任',
        "rectification": r'责令限期改正|责令改正'
    }

    liabilities = []
    for liability, pattern in liability_patterns.items():
        if re.search(pattern, content):
            liabilities.append(liability)

    return liabilities


def _extract_clauses(content: str) -> Dict[str, str]:
    """提取条款中的项（如(一)(二)或1.2.）"""
    clauses = {}
    # 匹配中文数字项（一）（二）
    chinese_clauses = re.findall(r'（([一二三四五六七八九十]+)）([^（）]+)', content)
    for num, text in chinese_clauses:
        clauses[f"clause_{num}"] = text.strip()

    # 匹配阿拉伯数字项1. 2. 或(1)(2)
    arabic_clauses = re.findall(r'(\d+)\.([^。；]+)|（(\d+)）([^。；]+)', content)
    for match in arabic_clauses:
        if match[0] and match[1]:  # 1. 形式
            clauses[f"clause_{match[0]}"] = match[1].strip()
        elif match[2] and match[3]:  # （1）形式
            clauses[f"clause_{match[2]}"] = match[3].strip()

    return clauses


def _generate_search_tags(title: str, scenarios: List[str], subjects: List[str]) -> List[str]:
    """生成多维度检索标签"""
    # 从标题提取核心词
    title_tags = re.findall(r'(\w+[法|条款|规定|情形|责任|合同])', title)

    # 转换场景和主体为可读标签
    scenario_tag_map = {
        "contract_signing": "合同订立",
        "contract_termination": "合同解除",
        "remuneration": "劳动报酬",
        "working_conditions": "工作条件",
        "compensation": "经济补偿",
        "dispute_resolution": "争议解决",
        "special_groups": "特殊群体"
    }
    scenario_tags = [scenario_tag_map[s] for s in scenarios if s in scenario_tag_map]

    subject_tag_map = {
        "employer": "用人单位",
        "employee": "劳动者",
        "both": "双方当事人"
    }
    subject_tags = [subject_tag_map[s] for s in subjects if s in subject_tag_map]

    # 去重并合并
    all_tags = list(set(title_tags + scenario_tags + subject_tags))
    return all_tags[:8]  # 限制最大标签数


def _calculate_retrieval_weight(article_num: str) -> float:
    """计算检索权重（高频咨询法条提升权重）"""
    # 高频法条权重提升（1.2倍）
    high_frequency_articles = [
        '第十条', '第十四条', '第十七条', '第十九条',
        '第三十八条', '第三十九条', '第四十六条', '第四十七条', '第八十二条'
    ]
    return 1.2 if article_num in high_frequency_articles else 1.0


# 使用示例
if __name__ == "__main__":
    # 示例预处理数据（实际使用时替换为preprocess_labor_law的输出）
    sample_processed_data = [
        {
            "id": "labor_law_010",
            "vector_text": "中华人民共和国劳动合同法 第二章 劳动合同的订立 第十条 建立劳动关系，应当订立书面劳动合同。已建立劳动关系，未同时订立书面劳动合同的，应当自用工之日起一个月内订立书面劳动合同。",
            "metadata": {
                "law_name": "中华人民共和国劳动合同法",
                "chapter": "第二章 劳动合同的订立",
                "chapter_code": "02",
                "article_num": "第十条",
                "article_num_code": "010",
                "article_title": "书面劳动合同订立要求",
                "content_clean": "建立劳动关系，应当订立书面劳动合同。已建立劳动关系，未同时订立书面劳动合同的，应当自用工之日起一个月内订立书面劳动合同。用人单位与劳动者在用工前订立劳动合同的，劳动关系自用工之日起建立。"
            }
        }
    ]

    # 生成结构化元数据
    structured_data = structure_labor_law_metadata(sample_processed_data)

    # 打印关键元数据字段
    for item in structured_data:
        print(f"法条编号: {item['metadata']['article_num']}")
        print(f"法律主体: {item['metadata']['legal_elements']['subjects']}")
        print(f"适用场景: {item['metadata']['applicable_scenarios']}")
        print(f"检索标签: {item['metadata']['search_tags']}")
        print(f"条款项: {item['metadata']['clauses']}\n")
